为什么需要每日自动复盘

光有 MEMORY.md 不够。它是「精选长期记忆」,但每天的零散操作、决策、报错、灵感,如果不落地,第二天就忘。人工写日记又容易断。

最省事的方案:用 cron 每天定时触发一个 agent 回合,跑一段脚本把当天的工作区状态、git 提交、关键日志汇总成一篇日记,存进 memory/YYYY-MM-DD.md。

下面给一套能直接跑的实战。

第一步:写一个汇总脚本

放在 scripts/daily_review.py,职责很单纯——收集「今天发生了什么」:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import datetime, pathlib, subprocess

TZ = datetime.timezone(datetime.timedelta(hours=8))
today = datetime.datetime.now(TZ).strftime('%Y-%m-%d')
ws = pathlib.Path('/root/.openclaw/workspace')

# 1) 当天 git 提交
try:
    log = subprocess.run(
        ['git', '-C', str(ws), 'log', f'--since={today} 00:00:00',
         '--pretty=format:- %s (%h)'],
        capture_output=True, text=True).stdout.strip()
except Exception:
    log = '(git 读取失败)'

# 2) 工作区未提交改动
try:
    st = subprocess.run(['git', '-C', str(ws), 'status', '--short'],
                        capture_output=True, text=True).stdout.strip()
except Exception:
    st = ''

lines = [f'# {today} 每日复盘', '']
lines.append('## Git 提交')
lines.append(log if log else '- (无)')
lines.append('')
lines.append('## 未提交改动')
lines.append('```\n' + (st if st else '(干净)') + '\n```')
out = ws / 'memory' / f'{today}.md'
out.write_text('\n'.join(lines), encoding='utf-8')
print(f'wrote {out}')

脚本只做「采集」,不替你写结论——结论留给 AI 在 cron 回合里补。

第二步:挂一个每天运行的 cron

用 cron 定义让它在每天 23:00 跑:

名称:每日自动复盘
计划:cron 0 23 * * * @ Asia/Shanghai
目标:isolated
消息:运行 python3 /root/.openclaw/workspace/scripts/daily_review.py ,
      然后读取刚生成的 memory/YYYY-MM-DD.md,
      结合今天 sessions 的关键产出,补写「今日决策 / 踩坑 / 待办」三段,
      并更新 MEMORY.md 里值得长期保留的条目。
      只做记录,不发推送。

要点:

  • isolated 目标 跑这种后台整理最合适,不占用你当前会话。
  • 静默(not requested) 避免每天被打扰,复盘是写给未来的自己看的。

第三步:加一道静默失败兜底(关键)

cron 最容易出的问题是静默失败——脚本报错、鉴权临时不可用,你完全感知不到,复盘悄无声息地断了。

参考 ensure_daily_post.py 的思路,做一个补跑闸:

# 每天 23:30 检查:今天的日记存在吗?不存在就补跑一次
import datetime, pathlib, subprocess
TZ = datetime.timezone(datetime.timedelta(hours=8))
today = datetime.datetime.now(TZ).strftime('%Y-%m-%d')
diary = pathlib.Path(f'/root/.openclaw/workspace/memory/{today}.md')
if not diary.exists():
    subprocess.run(['python3',
                    '/root/.openclaw/workspace/scripts/daily_review.py'])
    print('补跑:日记缺失,已重新生成')
else:
    print('OK:今日日记已存在')

把它也挂成 cron(30 23 * * *),和主任务错开半小时,互为备份。

实战踩坑提醒

  • 时区要对:cron 表达式的时区显式写 @ Asia/Shanghai,否则机器 UTC 会把「每天 23 点」算成北京时间早上 7 点。
  • 别让复盘变成噪音:脚本只采集事实(git/log),AI 只补「决策/踩坑/待办」三段,控制在 30 行内。太长没人看。
  • 兜底闸每天最多补一次:用状态文件记「今天是否已补跑」,避免反复触发。

小结

每日自动复盘 = 一个采集脚本 + 一个主 cron + 一个补跑闸。成本几乎为零(静默运行,不消耗你的注意力),回报是:任何时候翻 memory/,都能看到自己每天到底干了什么、为什么这么决策。

今天这篇,本身就是「被恢复的定时任务」场景下的产物——断更 23 天后重新跑通发布链路,正好印证了「兜底闸」的价值。


扫码关注公众号,获取更多 OpenClaw 实操技巧:

公众号二维码